﻿using CKS.PLC.Action.System;
using CKS.PLC.Core;
using Infrastructure;
using Mapster;
using Microsoft.Extensions.DependencyInjection;

using ZR.Model.Models.ProductionControl;

namespace CKS.PLC.Action
{
    /// <summary>
    /// 订阅动作基类 可根据不同项目自行定义ActionId
    /// </summary>
    public abstract partial class PLCAction : BasePlcAction
    {
        protected PLCAction(DecodeValue _value) : base(_value)
        {
        }

        /// 如果多个站 每个站的每个DB文件的操作编号可以相同。 根据工站编号 - DB块 - 操作编号类 程序目录示例： OP50/DB3011/CKS01Action.cs、OP60/DB3010/CKS01Action.cs
        // 流程action 1 - 100 1 请求加工 2请求保存 纯数据 101 - 200

        /*
         插件式：每次执行前检查DLL是否发生变化，
            1.有变化则更新缓存程序集
            2.从缓存程序集提取实例执行
         */
        // var value = (DecodeValue)dv;

        /*
         * EffectType:
                     1订阅数据、2 MES心跳、3 PLC心跳、4实时采集 5 单表数据追溯
                     6 订阅+保存结果 7PLC确认 8 上传工艺参数 9 请求加工
         */

        public static PLCAction GetInstance(DecodeValue value)
        {
            var position = value.Position;
            if (position.EffectType == 5)
                return new SaveProcessingResults(value);
            if (position.EffectType == 7)
                return new PlcOnTechniqueReceived(value);
            if (position.EffectType == 8)
                return new UploadTechniqueAction(value);
            if (position.EffectType == 9)
                return new StartWorkingAction(value);

            switch (position.PlcId)
            {
                case 1:
                case 2:
                    return GetSaveInstance(value);
                //订阅点需手动补充逻辑

                default:
                    throw new InvalidOperationException("当前工位编号逻辑尚未添加");
            }

            //switch (value.Position.ActionId)
            //{
            //    case 9999:
            //        return new Test00Action(value);
            //    case 1:
            //        return new Cks01Action(value);
            //    default:
            //        throw new InvalidOperationException("未实现的操作编号");
            //}
        }

        private static PLCAction GetSaveInstance(DecodeValue value)
        {
            switch (value.Position.ActionId)
            {
                case 101:
                case 201:
                case 301:
                    return new Subscription.ActionTask(value);

                default:
                    throw new InvalidOperationException("未实现的操作编号");
            }
        }
    }
}